package com.gxa.employment.controller;

import com.alibaba.excel.EasyExcel;
import com.gxa.employment.common.ClazzDataListener;
import com.gxa.employment.common.Result;
import com.gxa.employment.entity.dto.ClazzNotEmploymentDto;
import com.gxa.employment.entity.dto.ClazzSearchDto;
import com.gxa.employment.entity.dto.ClazzServiceAddDto;
import com.gxa.employment.entity.dto.ClazzUpdateReasonDto;
import com.gxa.employment.entity.pojo.Clazz;
import com.gxa.employment.entity.pojo.ClazzEmpStu;
import com.gxa.employment.entity.pojo.Major;
import com.gxa.employment.entity.vo.PageVo;
import com.gxa.employment.service.ClazzService;
import com.gxa.employment.service.MajorService;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * <p>
 * 班级信息表 前端控制器
 * </p>
 *
 * @author author
 * @since 2025-03-25
 */
@RestController
@RequestMapping("/clazz")
public class ClazzController {
    @Autowired
    private ClazzService clazzService;
    @Autowired
    private MajorService majorService;
    @Autowired
    RedisTemplate<String,Object> redisTemplate;
    //批量上传
    @PostMapping("/addBitch")
    public Result insertBitch(@RequestBody List<ClazzServiceAddDto> clazzServiceAddListDto){
        // 调用 clazzService 的 addClazzBitch 方法，将 clazzServiceAddListDto 作为参数传递
        // 该方法返回一个 Boolean 类型的值，表示操作是否成功
        Boolean aBoolean = clazzService.addClazzBitch(clazzServiceAddListDto);
        // 调用 Result 类的 success 方法，返回一个表示操作成功的 Result 对象
        return Result.success();
    }

    //根据班级id，就业状态，page查询就业和未就业的学生
    @PostMapping("/searchEmployment")
    public Result searchNotEmployment(@RequestBody ClazzNotEmploymentDto clazzNotEmploymentDto){
        // 调用clazzService的searchByClazzNotEmployment方法，传入clazzNotEmploymentDto作为参数
        // 该方法会返回一个PageVo对象，包含了分页查询的结果
        PageVo pageVo = clazzService.searchByClazzNotEmployment(clazzNotEmploymentDto);
        // 返回一个Result对象，包含分页查询结果，表示查询成功
        return Result.success(pageVo);
    }

    //根据班级id修改就业天数和就业原因
    @PostMapping("/updateReason")
    public Result updateReason(@RequestBody ClazzUpdateReasonDto clazzUpdateReasonDto){
        // 调用clazzService的updateReason方法，传入clazzUpdateReasonDto对象
        // 该方法根据班级id修改就业天数和就业原因，并返回一个布尔值表示是否修改成功
        Boolean aBoolean = clazzService.updateReason(clazzUpdateReasonDto);
        if(aBoolean){
            ValueOperations<String, Object> operations = redisTemplate.opsForValue();
            operations.set("StudentStatus:" , "修改过");

        }
        // 返回一个表示成功的Result对象
        return Result.success();
    }

    //根据就业状态，班级名字，page来获取班级列表
    @PostMapping("/rate")
    public Result getClazzStudentReport(@RequestBody ClazzSearchDto clazzSearchDto) {
        // 调用clazzService的getClazzStudentReport方法，获取班级信息的分页数据
        PageVo clazzStudentReport = clazzService.getClazzStudentReport(clazzSearchDto);

        // 返回成功的结果，并将班级学生报告作为数据返回
        return Result.success(clazzStudentReport);
    }

    @GetMapping("/getClazzList")
    public Result getClazzList(){
        // 调用clazzService的getClazzList方法获取班级列表
        List<Clazz> clazzList = clazzService.list();
        Set<String> list=new HashSet<>();
        for (Clazz clazz : clazzList) {
            list.add(clazz.getClazzName());
        }
        // 返回包含班级列表的成功结果
        return Result.success(list);
    }
    // 获取方向列表的接口
    @GetMapping("/getMajorList")
    public Result getMajorList(){
        // 调用 majorService 的 list 方法获取所有方向列表
        List<Major> list = majorService.list();
        // 返回包含方向列表的成功结果
        return Result.success(list);
    }

    // 查询班级就业详情
    @GetMapping("/employmentDetails")
    public Result getClazzEmploymentDetails() {
        // 从班级服务中获取班级就业详情列表
        List<ClazzEmpStu> clazzEmpStuList = clazzService.getClazzEmploymentDetails();
        // 返回成功的结果，包含班级就业详情列表
        return Result.success(clazzEmpStuList);
    }

    @PostMapping("/getEmployment")
    public Result getEmployment(@RequestBody ClazzSearchDto clazzSearchDto) {
        String clazzName = clazzSearchDto.getClazzName();
        String clazzStatus = clazzSearchDto.getClazzStatus();
        Integer size = clazzSearchDto.getSize();
        Integer page = clazzSearchDto.getPage();
        PageVo pageVo=new PageVo<>();

        if (clazzStatus.equals("已就业")){
            pageVo= clazzService.searchStudent(clazzSearchDto);


        }else if(clazzStatus.equals("未就业")){
            pageVo = clazzService.searchNotStudent(clazzSearchDto);
        }else if (clazzStatus==""){
            pageVo=clazzService.searchNotStudent(clazzSearchDto);

        }

        // 返回成功的结果，包含班级就业详情列表
        return Result.success(pageVo);
    }

    @PostMapping("/upload")
    @Operation(summary = "批量导入班级信息")
    public Result uploadFile(@RequestParam("file") MultipartFile file) {
        try {
            // 创建StudentDataListener对象，用于监听Excel读取过程
            ClazzDataListener listener = new ClazzDataListener(clazzService,majorService);
            // 使用EasyExcel读取Excel文件
            EasyExcel.read(file.getInputStream(), ClazzServiceAddDto.class, listener).sheet().doRead();
            // 获取失败的记录
            List<ClazzServiceAddDto> failedRecords = listener.getFailedRecords();
            // 如果存在失败的记录
            if (!failedRecords.isEmpty()) {
                // 返回失败记录的数量
                return Result.error(500,"导入失败，共有" + failedRecords.size() + "条记录");
            }
            //导入成功后更新redis中的状态标记

            ValueOperations<String, Object> operations = redisTemplate.opsForValue();
            operations.set("StudentStatus:" , "修改过");


            // 返回导入成功的信息
            return Result.success("导入成功");
        } catch (IOException e) {
            // 如果发生IO异常，返回错误信息
            return Result.error(500,"导入失败，文件上传出错");
        }
    }




}
